import type { AuthApi } from '#/api/core/auth';
import { useAccessStore } from '@vben/stores';
import { getJwtConfigApi } from '#/api/core/sysconfig';
import { getTokenStatusApi } from '#/api/core/auth';

/**
 * Token管理器 - 简洁版本
 * 职责：
 * 1. 管理自动续期开关
 * 2. 根据开关启动/停止定时任务
 * 3. 定时任务模拟请求触发后端续期机制
 */
export class TokenManager {
  private static instance: TokenManager;
  private autoRefreshTimer: number | null = null;
  private autoRefreshEnabled = false;
  private renewalThresholdMinutes = 10;

  private constructor() {
    // 初始化时加载配置
    this.loadJwtConfig();
  }

  public static getInstance(): TokenManager {
    if (!TokenManager.instance) {
      TokenManager.instance = new TokenManager();
    }
    return TokenManager.instance;
  }

  /**
   * 加载JWT配置
   */
  private async loadJwtConfig(): Promise<void> {
    try {
      const config = await getJwtConfigApi();
      this.autoRefreshEnabled = config.autoRefresh;
      this.renewalThresholdMinutes = config.renewalThreshold;
      console.log('TokenManager配置加载完成:', {
        autoRefresh: config.autoRefresh,
        renewalThreshold: config.renewalThreshold
      });
    } catch (error) {
      console.warn('加载JWT配置失败，使用默认值:', error);
    }
  }

  /**
   * 更新JWT配置
   */
  public updateJwtConfig(config: { autoRefresh: boolean; renewalThreshold: number }): void {
    this.autoRefreshEnabled = config.autoRefresh;
    this.renewalThresholdMinutes = config.renewalThreshold;

    console.log('TokenManager配置已更新:', {
      autoRefresh: config.autoRefresh,
      renewalThreshold: config.renewalThreshold
    });

    // 🔥 根据开关状态启动或停止定时任务
    if (config.autoRefresh) {
      this.startAutoRefreshTask();
    } else {
      this.stopAutoRefreshTask();
    }
  }

  /**
   * 检查是否启用自动续期
   */
  public isAutoRefreshEnabled(): boolean {
    return this.autoRefreshEnabled;
  }

  /**
   * 启动自动续期定时任务
   */
  public startAutoRefreshTask(): void {
    // 如果自动续期关闭，不启动任务
    if (!this.autoRefreshEnabled) {
      console.log('自动续期已关闭，不启动定时任务');
      return;
    }

    // 停止之前的任务
    this.stopAutoRefreshTask();

    // 启动新的定时任务（每1分钟）
    this.autoRefreshTimer = window.setInterval(async () => {
      await this.executeAutoRefreshTask();
    }, 1 * 60 * 1000);

    console.log('🚀 自动续期定时任务已启动（间隔：1分钟）');

    // 🔥 移除立即执行，避免频繁调用后端API
    // 让定时任务自然触发即可
  }

  /**
   * 停止自动续期定时任务
   */
  public stopAutoRefreshTask(): void {
    if (this.autoRefreshTimer) {
      clearInterval(this.autoRefreshTimer);
      this.autoRefreshTimer = null;
      console.log('⏹️ 自动续期定时任务已停止');
    }
  }

  /**
   * 执行自动续期任务
   */
  private async executeAutoRefreshTask(): Promise<void> {
    try {
      const accessStore = useAccessStore();

      // 如果没有Token，停止任务
      if (!accessStore.accessToken) {
        console.log('没有Token，停止自动续期任务');
        this.stopAutoRefreshTask();
        return;
      }

      // 如果自动续期已关闭，停止任务
      if (!this.autoRefreshEnabled) {
        console.log('自动续期已关闭，停止定时任务');
        this.stopAutoRefreshTask();
        return;
      }

      console.log('🔄 执行自动续期任务：模拟请求触发后端续期机制...');

      // 🔥 调用后端API模拟请求，触发续期机制
      const tokenStatus = await getTokenStatusApi();

      if (!tokenStatus || !tokenStatus.valid) {
        console.warn('Token已失效，停止自动续期任务');
        this.stopAutoRefreshTask();
        return;
      }

      // 🔥 如果后端返回新Token，自动更新
      if (tokenStatus.newToken) {
        accessStore.setAccessToken(tokenStatus.newToken);
        console.log('✅ 自动续期成功：Token已更新');
      } else {
        console.log('⏳ 自动续期任务完成：后端未返回新Token（可能未到续期阈值）');
      }

    } catch (error) {
      console.error('自动续期任务执行失败:', error);

      // 如果是401错误，停止任务
      if ((error as any)?.response?.status === 401) {
        console.warn('Token已失效，停止自动续期任务');
        this.stopAutoRefreshTask();
      }
    }
  }

  /**
   * 处理响应头中的Token
   * 约束：当自动续期关闭后，只要收到X-New-Token头数据就替换Token
   */
  public handleTokenFromResponse(headers: Record<string, any> | undefined): void {
    if (!headers) {
      return;
    }

    // 🔥 添加调试日志，查看所有响应头
    console.log('🔍 收到响应头:', headers);
    console.log('🔍 响应头键名:', Object.keys(headers));

    // 🔥 支持多种可能的头名称格式
    const newToken = headers['x-new-token'] ||
                     headers['X-New-Token'] ||
                     headers['X-NEW-TOKEN'] ||
                     headers['x-new-token'.toLowerCase()];

    const tokenRefreshed = headers['x-token-refreshed'] ||
                          headers['X-Token-Refreshed'] ||
                          headers['X-TOKEN-REFRESHED'];

    console.log('🔍 检测到的newToken:', newToken);
    console.log('🔍 检测到的tokenRefreshed:', tokenRefreshed);

    // 🔥 无论自动续期是否开启，只要收到X-New-Token头就替换Token
    if (newToken) {
      const accessStore = useAccessStore();
      accessStore.setAccessToken(newToken);

      if (this.autoRefreshEnabled) {
        console.log('✅ 响应头续期：Token已更新（自动续期开启）');
      } else {
        console.log('✅ 响应头续期：Token已更新（自动续期关闭，但仍处理X-New-Token头）');
      }
    }

    // 兼容旧的x-token-refreshed头
    else if (tokenRefreshed === 'true' && newToken) {
      const accessStore = useAccessStore();
      accessStore.setAccessToken(newToken);

      if (this.autoRefreshEnabled) {
        console.log('✅ 响应头续期：Token已更新（自动续期开启，旧格式）');
      } else {
        console.log('✅ 响应头续期：Token已更新（自动续期关闭，但仍处理旧格式头）');
      }
    } else {
      console.log('🔍 未发现新Token头，跳过更新');
    }
  }

  /**
   * 测试Token处理功能（用于调试）
   */
  public testTokenProcessing(testHeaders: Record<string, any>): void {
    console.log('🧪 测试Token处理功能...');
    this.handleTokenFromResponse(testHeaders);
  }
}

/**
 * 获取Token管理器实例
 */
export const tokenManager = TokenManager.getInstance();

// 🔥 开发环境下将tokenManager暴露到window对象，方便调试
if (typeof window !== 'undefined' && import.meta.env.DEV) {
  (window as any).tokenManager = tokenManager;
  console.log('🔧 开发模式：tokenManager已暴露到window.tokenManager，可用于控制台调试');
  console.log('🔧 测试示例：window.tokenManager.testTokenProcessing({"x-new-token": "test-token"})');
}
